package com.example.excel.queue;

public class CircleArrayQueueDemo {
    public static void main(String[] args) {

    }


    class CircleArray{

        private int maxSize;//表示数组最大容量
        private int front;//队列头
        private int rear;//队列尾
        private int[] arr;//该数组用于存放数据,模拟队列

        //创建队列构造器4
        public CircleArray(int arrMaxSize){
            maxSize=arrMaxSize;
            arr=new int[maxSize];
        }


        //判断队列是否满
        public Boolean isFull(){
            return (rear+1)%maxSize==front;
        }
        //判断队列是否为空
        public Boolean isEmpty(){
            return rear==front;
        }

        //添加数据到队列
        public void addQueue(int n){
            //判断队列是否满
            if (isFull()){
                System.out.println("队列满,不能加入数据");
                return;
            }

            //直接将数据加入
            arr[rear]=n;
            //让rear 后移,这里必须考虑取模
            rear=(rear+1) % maxSize;
        }


                //获取队列的数据,出队列
        public int getQueue(){
            //判断队列是否为空
            if (isEmpty()){
                //通过抛出异常
                throw new RuntimeException("队列空,不能取出数据");
            }

            //这里需要分析出front是指向队列的第一个元素
            //1.先把front 对应的值保存到一个变量
            //2.将front 后移,考虑取模
            //3.将临时保存的变量返回
            int value =arr[front];
            front=(front+1) % maxSize;
            return value;
        }


        //显示队列所有数据
        public void showQueue(){
            if (isEmpty()){
                System.out.println("队列为空,没有数据");
                return;
            }

            //思路：重fornt开始遍历，遍历多少个元素
            for (int i = front; i < front+size(); i++) {
                System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
            }
        }

        //求出当前队列有效数据
        public int size(){
            return (rear+maxSize-front)%maxSize;
        }


        //显示队列的头数据,注意不是取数据
        public int hearQueue(){
            if (isEmpty()){
                throw new RuntimeException("队列为空,没有数据");
            }
            return arr[front];
        }


    }
}
